文章目录
  1. 1. maven 介绍
  2. 2. maven入门
    1. 2.1. maven安装
    2. 2.2. 本地仓库安装
    3. 2.3. 新建一个简单的项目
    4. 2.4. 创建代码和测试代码
    5. 2.5. 运行mvn
    6. 2.6. maven的生成方式
  3. 3. maven 依赖
    1. 3.1. 依赖包的查询
    2. 3.2. 依赖的传递性
    3. 3.3. 依赖的范围
    4. 3.4. 聚合和继承

maven 介绍

Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven使用标准的目录结构和默认构建生命周期。

在多个开发团队环境时,Maven可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。

Maven提供了开发人员的方式来管理:

  • Builds
  • Documentation

  • Reporting

  • Dependencies

  • SCMs

  • Releases

  • Distribution

  • mailing list

概括地说,Maven简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。 Maven增加可重用性并负责建立相关的任务。

maven入门

maven安装

  1. 下载maven版本

  2. 配置环境变量

    MAVEN_HOME : D:\apache-maven-3.0.2

    MAVEN : %MAVEN_HOME%\bin

    (可选) MAVEN_OPTS : -Xms256m -Xmx512m

    在path 前面 加上 %MAVEN%;

  1. 验证安装是否成功

    在命令行上输入 : mvn -version; 回车,如看到下面信息表示安装成功:

本地仓库安装

修改maven目录下的conf中的setting.xml

<!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
<localRepository>F:/JAVA/maven/repos</localRepository>

上面的路径改为你自己本地电脑存放仓库的路径。

新建一个简单的项目

主要创建文件pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.zju.shch.user</groupId>
  <artifactId>user-core</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>user-core</name>
  <url>http://maven.apache.org</url>

  <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.10.Final</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>
<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>
<dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>

  </dependencies>
</project>

上面groupId用来表示项目的名称,artifactId表示项目模块的名称,建议用项目名称-模块名称表示,version表示这个项目的版本名称。

创建代码和测试代码

源代码应该放置到src/main/java中

源代码的资源文件应该放置在src/main/resources文件夹中

测试代码应该放置到src/test/java中

测试代码的资源文件应该放置在src/test/resources文件夹中

运行mvn

mvn clean —>表示运行清理操作(会默认把target文件夹中的数据清理)

mvn clean compile—>表示先运行清理之后运行编译,会见代码编译到target文件夹中

mvn clean test—>运行清理和测试

mvn clean package—>运行清理和打包

mvn clean install—>运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用

mvn clean deploy—>运行清理和发布(发布到私服上面)

maven的生成方式

由于maven有一些固定的生成模式,所以使用

mvn archetype generate可以自动完成这个骨架的建立

使用eclipse开发maven项目

默认STS和myeclipse都自带了maven的支持

 如果是eclipse需要安装m2eclipse

注意:eclipse中使用maven插件的时候,运行run as maven build的时候报错

-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.

可以设一个环境变量M2_HOME指向你的maven安装目录
M2_HOME=D:\Apps\apache-maven-3.3.1

然后在Window->Preference->Java->Installed JREs->Edit
在Default VM arguments中设置

-Dmaven.multiModuleProjectDirectory=$M2_HOME

maven 依赖

依赖包的查询

1、所有的依赖都是通过坐标来进行存储的(GAV—>groupId、artifactId、version)

2、有一些网上的仓库提供了坐标的查询(http://mvnrepository.com)

3、通过设置依赖

<dependency>
  <groupId>***</groupId>
  <artifactId>***</artifactId>
  <version>**</version>
  <scope>***</scope>
</dependency>

</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.10.Final</version>
</dependency>

maven是如何搜索依赖的?首先会在本地仓库查询如果本地仓库没有,就去中央仓库查询

依赖的传递性

依赖是会被传递

A—>C B—>A ==> B—>C(这种依赖是基于compile这个范围进行传递)

对于依赖的传递而言,主要是针对compile作用域传递

注意:传递的冲突问题
1、a—>b1.0 c—>b1.1 d—>a和c,这个时候在d的pom中,哪一个依赖先写就使用先写依赖的版本
如果d—>ac—>依赖版本是b1.0

2、a—>b1.0 c—>b1.1 d—>a和c—>b1.0 f—>d,c,如果路径的长短不一致就选择最小路径 f—>b1.1

3、如果希望精确的控制依赖包,可以使用依赖的排除功能进行控制

依赖的范围

1、test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖

2、compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去

3、provided依赖:在编译和测试的过程有效,最后生成war包时不会加入,诸如:servlet-api,因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突

4、runtime在运行的时候依赖,在编译的时候不依赖

默认的依赖范围是compile

聚合和继承

聚合:为了能够使用一条命令就能构建 account-email和 account-persist两个模块,我们需要建立一个额外的名为 account-aggregator的模块,然后通过该模块构建整个项目的所有模块。 account-aggregator本身也是个 Maven项目,它的 POM如下

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging> pom </packaging>
    <name>Account Aggregator</name>
     <modules>
        <module>account-email</module>
        <module>account-persist</module>
     </modules>
</project>

注意:packaging的类型为pom ,module的值是一个以当前POM为主目录的相对路径。

继承:可声明父POM供子 POM继承

父模块POM如下:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook.account</groupId>
    <artifactId> account-parent </artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>Account Parent</name>
</project>

子模块声明继承如下:

<project>
    <modelVersion>4.0.0</modelVersion>

    < parent >
        <groupId>com.juvenxu.mvnbook.account</groupId>
        <artifactId> account-parent </artifactId>
        <version>1.0.0-SNAPSHOT</version>
        < relativePath >../account-parent/pom.xml</ relativePath>
    </ parent >

    <artifactId> account-email </artifactId>
    <name>Account Email</name>
  ...
</project>

最后,同样还需要把 account-parent加入到聚合模块account-aggregator中。聚合的 POM如下:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.juvenxu.mvnbook.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging> pom </packaging>
    <name>Account Aggregator</name>
    <modules>
        <module>account-email</module>
        <module>account-persist</module>
        <module> account-parent</module>
    </modules>
</project>

注意:
1、子模块没有声明groupId和version, 这两个属性继承至父模块。但如果子模块有不同与父模块的 groupId、version ,也可指定;

2、不应该继承artifactId,如果groupId ,version,artifactId 完全继承的话会造成坐标冲突;另外即使使用不同的 groupId或version,同样的 artifactId也容易产生混淆。

3、使用继承后 parent也必须像自模块一样加入到聚合模块中。也就是在在聚合模块的 pom中加入account-parent

聚合与继承的关系:

区别 :

1.对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

2.对于继承关系的父 POM来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父 POM是什么。

共同点 :

1.聚合 POM与继承关系中的父POM的 packaging都是pom

2.聚合模块与继承关系中的父模块除了 POM之外都没有实际的内容。

Maven可继承的POM 元素

groupId :项目组 ID ,项目坐标的核心元素;
version :项目版本,项目坐标的核心元素;
description :项目的描述信息;
organization :项目的组织信息;
inceptionYear :项目的创始年份;
url :项目的 url 地址
develoers :项目的开发者信息;
contributors :项目的贡献者信息;
distributionManagerment :项目的部署信息;
issueManagement :缺陷跟踪系统信息;
ciManagement :项目的持续继承信息;
scm :项目的版本控制信息;
mailingListserv :项目的邮件列表信息;
properties :自定义的 Maven 属性;
dependencies :项目的依赖配置;
dependencyManagement :醒目的依赖管理配置;
repositories :项目的仓库配置;
build :包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting :包括项目的报告输出目录配置、报告插件配置等。
文章目录
  1. 1. maven 介绍
  2. 2. maven入门
    1. 2.1. maven安装
    2. 2.2. 本地仓库安装
    3. 2.3. 新建一个简单的项目
    4. 2.4. 创建代码和测试代码
    5. 2.5. 运行mvn
    6. 2.6. maven的生成方式
  3. 3. maven 依赖
    1. 3.1. 依赖包的查询
    2. 3.2. 依赖的传递性
    3. 3.3. 依赖的范围
    4. 3.4. 聚合和继承